package com.cskaoyan.javase.exception._1handle._4throw;

/**
 * @description: throw关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.SplittableRandom;

/**
 * 如果你想明确的,在方法中抛出一个异常的对象,而不是表示可能性,就需要使用throw关键字
 * throw关键字 是在方法体中使用的,它的语法是:
 *      throw + 某个异常对象
 * 表示明确的在方法的某一行抛出一个异常,而不是throws的可能性
 *
 * 怎么得到一个异常对象?
 *      使用new关键字创建对象,依赖于异常类的构造方法
 *      所有的异常类都有两个构造方法:
 *          无参和String单参数的
 *          无参创建的异常对象,没有任何描述信息
 *          String单参数创建的是具有描述信息的异常对象
 *
 * throw在方法体中的使用:
 *      1.throw关键字会明确的在类的某个位置抛出一个异常:
 *          a.如果是一个运行时异常,不处理它会默认向上抛出,抛给方法调用者
 *              当然你也可以在方法中捕获它,但是没有太大意义
 *              建议对于抛出运行时异常,抛出后就无需管,任由方法的调用者去处理它
 *          b.如果是一个编译时异常,那么编译器会强制处理它
 *              建议配合throws关键字抛出该编译时异常,让方法调用处处理它
 *
 *
 *      2.使用throw关键字抛出异常,方法后面的代码都不会执行了,所以很多时候可以用throw替代return
 *          尤其在不方便给出方法返回值的时候
 *
 * 以上总结:
 *      异常类和对象当中只是存放异常相关的信息,异常的抛出依赖于throws和throw关键字,异常的处理需要程序员写相关的代码
 *          或者依赖默认处理
 *          反正和异常类型以及对象没有关系
 *
 */
public class Demo {
    public static void main(String[] args) {
        try {
            test();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("after");

        try {
            test2();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        System.out.println("after");
    }

    public static void test()  {
        //使用throw抛出一个对象 NullPointerException
        //NullPointerException e = new NullPointerException();
        throw new NullPointerException("我的空指针异常");
    }

    public static void test2() throws CloneNotSupportedException {
        //抛出一个克隆异常
        throw new CloneNotSupportedException("我的克隆异常");
    }

}
